from pathlib import Path

from PIL import Image,ImageEnhance

from wenjian import get_file_format, ensure_parent_directory_exists

def huoquchicun(filepath):
    """
    获取图片尺寸
    :param filepath: 文件路径
    :return: str
    """
    try:
        with Image.open(filepath) as img:

            img.verify()  # 验证文件是一个有效的图片
            return str(img.width)+'x'+str(img.height)

    except (IOError, SyntaxError):

        return False
def is_image_file_by_pillow(filepath):
    """
    判断文件是否是图片
    :param filepath: 文件路径
    :return: bool
    """
    try:
        with Image.open(filepath) as img:

            img.verify()  # 验证文件是一个有效的图片

            return True

    except (IOError, SyntaxError):

        return False


def get_format_extension(format_name):
    """将图像格式转换为常见的文件后缀，不带‘.’"""
    # 创建一个映射，将Pillow的格式名称转换为常见的文件扩展名
    format_to_extension = {
        'JPEG': 'jpg',  # 或者 'jpeg'
        'JPG': 'jpg',
        'PNG': 'png',
        'GIF': 'gif',
        'BMP': 'bmp',
        'PPM': 'ppm',
        'TIFF': 'tiff',
        'WEBP': 'webp',
        # 添加更多格式映射...
    }

    return format_to_extension.get(format_name.upper(), '.unknown')


def background(img: Image, size, color=(0, 0, 0, 0)):
    """
    将原始图像放置在新图像的正中央。

    :param img: PIL.Image 对象，原始图像
    :param size: tuple，新图像的尺寸 (宽, 高)
    :param color: tuple，新图像的背景色（RGBA） (默认为黑色透明)
    :return: PIL.Image 对象，新的图像
    """
    width, height = size
    img = img.convert('RGBA')
    newimg = Image.new(mode=img.mode, size=(width, height), color=color)

    # 计算原始图像的尺寸
    orig_width, orig_height = img.size

    # 计算起始位置（左上角坐标），使原始图像居中
    left = (width - orig_width) // 2
    top = (height - orig_height) // 2

    # 将原始图像粘贴到新图像的正中央
    newimg.paste(img, (left, top))

    return newimg
def save_image_with_mode_conversion(image, output_path, geshi):
    """
    保存图片，并自动指定模式
    :param image: PIL.Image 对象，原始图像
    :param output_path: 路径
    :param geshi 格式
    """
    # 确定需要的模式
    if geshi.upper() in ['JPEG', 'JPG']:
        # JPEG 不支持透明度 (RGBA 或 LA 模式)
        if image.mode in ('RGBA', 'LA') or (image.mode == 'P' and 'transparency' in image.info):
            # 创建一个白色背景的 RGB 图像
            bgd = Image.new('RGB', image.size, (255, 255, 255))
            # 如果原图像是 RGBA 或 LA 模式，则使用 alpha 通道作为蒙版进行粘贴
            if image.mode == 'RGBA':
                bgd.paste(image, mask=image.split()[3])  # 使用 alpha 通道作为蒙版
            elif image.mode == 'LA':
                bgd.paste(image, mask=image.split()[1])  # 使用亮度通道作为蒙版
            else:
                bgd.paste(image)  # 对于带有透明度的调色板图像
            image = bgd
        elif image.mode != 'RGB':
            image = image.convert('RGB')
    elif geshi.upper() == 'PNG':
        # PNG 支持透明度，所以不需要转换
        pass
    else:
        # 对于其他格式，如果有必要的话可以添加额外的处理逻辑
        # 这里假设其他格式都接受 RGB 模式
        if image.mode not in ('RGB', 'L'):
            image = image.convert('RGB')

    # 保存图像
    image.save(output_path, geshi)


def chiliimage(inputfilepath,outputfilepath,chuliway):
    if not is_image_file_by_pillow(inputfilepath):
        return False

    img = Image.open(inputfilepath)#打开图片

    geshi = img.format
    houzhui = get_file_format(inputfilepath)

    img=img.convert('RGBA')

    if chuliway['处理方式']['增强']:
        # 亮度调整
        enhancer = ImageEnhance.Brightness(img)
        img = enhancer.enhance(chuliway['增强']['亮度'])  # 增加亮度，1.0 是原始亮度，大于1.0增加亮度，小于1.0降低亮度

        # 对比度调整
        enhancer = ImageEnhance.Contrast(img)
        img = enhancer.enhance(chuliway['增强']['对比度'])  # 增加对比度，1.0 是原始对比度，大于1.0增加对比度，小于1.0降低对比度

        # 颜色平衡（饱和度）调整
        enhancer = ImageEnhance.Color(img)
        img = enhancer.enhance(chuliway['增强']['饱和度'])  # 增加饱和度，1.0 是原始饱和度，大于1.0增加饱和度，小于1.0减少饱和度

        # 锐化调整
        enhancer = ImageEnhance.Sharpness(img)
        img = enhancer.enhance(chuliway['增强']['锐化'])  # 增加锐化程度，1.0 是原始锐度，大于1.0增加锐度，小于1.0减少锐度

    if chuliway['处理方式']['格式']:
        if chuliway['格式']!='no':
            geshi=chuliway['格式']
            houzhui=get_format_extension(geshi)

    if chuliway['处理方式']['比例'] ==True or chuliway['处理方式']['尺寸'] ==True:
        back_kuan=img.width
        back_gao=img.height
        kuan=img.width
        gao=img.height
        if chuliway['处理方式']['比例'] ==True and chuliway['处理方式']['尺寸'] ==True:
            back_kuan = chuliway['尺寸']['宽']
            back_gao = chuliway['尺寸']['高']
            if back_kuan == 0:
                back_kuan = int(back_gao * chuliway['比例']['宽'] / chuliway['比例']['高'] + 0.5)
            elif back_gao == 0:
                back_gao = int(back_kuan * chuliway['比例']['高'] / chuliway['比例']['宽'] + 0.5)
        elif chuliway['处理方式']['比例'] ==False and chuliway['处理方式']['尺寸'] ==True:
            back_kuan = chuliway['尺寸']['宽']
            back_gao = chuliway['尺寸']['高']
        else:
            bilikuan = chuliway['比例']['宽']
            biligao = chuliway['比例']['高']

            if chuliway['裁剪与拉伸'] == '适应':
                if img.width / img.height < bilikuan / biligao:
                    back_kuan = int(back_gao * bilikuan / biligao + 0.5)
                else:
                    back_gao = int(back_kuan * biligao / bilikuan + 0.5)
            elif chuliway['裁剪与拉伸'] == '裁剪':
                if img.width / img.height > bilikuan / biligao:
                    back_kuan = int(back_gao * bilikuan / biligao + 0.5)
                else:
                    back_gao = int(back_kuan * biligao / bilikuan + 0.5)
            else:
                if img.width / img.height < bilikuan / biligao:
                    back_kuan = int(back_gao * bilikuan / biligao + 0.5)
                else:
                    back_gao = int(back_kuan * biligao / bilikuan + 0.5)
        if chuliway['裁剪与拉伸'] == '适应':
            if img.width / img.height < back_kuan / back_gao:
                kuan=int(back_gao/img.height*kuan+0.5)
                gao=back_gao
            else:
                gao = int(back_kuan / img.width * gao+0.5)
                kuan = back_kuan
        elif chuliway['裁剪与拉伸'] == '裁剪':
            if img.width / img.height > back_kuan / back_gao:
                kuan = int(back_gao / img.height * kuan + 0.5)
                gao = back_gao
            else:
                gao = int(back_kuan / img.width * gao + 0.5)
                kuan = back_kuan
        else:
            gao=back_gao
            kuan=back_kuan
        print(kuan,gao)
        print(back_kuan,back_gao)
        img=img.resize((kuan, gao), Image.Resampling.LANCZOS)
        img=background(img,(back_kuan,back_gao),(0,0,0,0))





    outputfilepath = Path(outputfilepath)
    if houzhui=='':
        pass
    else:
        outputfilepath = outputfilepath.with_suffix('.'+houzhui)
    print(outputfilepath)
    ensure_parent_directory_exists(outputfilepath)
    save_image_with_mode_conversion(img, outputfilepath, geshi)